#include "struct.h"
#include "ChainArr.h"
#include "CreerListeCh.h"

/*****************************************
**  Nom : CARRUELLE						**
**	Nom du fichier : ChainArr			**
**	Description : Gestion du chainage	**
**	arriere								**
**										**
**	Date:09/08/2014					    **
**  Statut:Release						**
*****************************************/

/*************************************************
**  Zone de déclaration des Fonctions PUBLIC    **
*************************************************/

/*************************************************************************
**  [Fonction ChainArr_VerifBut]                      					**
**  Moteur principal du chainage arriere						        **
**																		**
**	Entrees : Char* Tableau contenant le BUT                            **
**			: ST_RES* Tete de la chaine de resultats					**
**			: ST_FAITS* Tete de la chaine de faits						**
**																		**
**	Sorties : int														**
**				0 Le But n'est pas demontre                             **
**				1 Le But est valide                                 	**
**				-2 Erreur de chaine										**
**************************************************************************/
int ChainArr_VerifBut (char* But,ST_RES* res_tete,ST_FAITS* fait_tete)
{
	int result = 0;//Resultat de la recherche
	ST_RES *R=NULL;
	ST_COND *Hypothese=NULL;
	int Continue;
	if(strlen(But)==0)
		ChainArr_RecupBut (But,res_tete);				//Recupere la but a chercher

	printf("But : <%s>\n",But);
	if(res_tete==NULL || fait_tete == NULL)				//si liste vide Erreur	
		return -2;
	if(!ChainArr_VerifFait (But,fait_tete))				//Verifie si le But courant est compris dans les fait
	{
		R = res_tete;
		while(R!=NULL && result == 0)					//Boucle tant que Regle != de null et result FAUX
		{			
			if(strcmp(But,R->res) !=  0)
				printf("Le resultat (%s) ne fait pas partie des résultats_regles (%s)\n",R->res,But);
			else
			{
				printf("Le resultat (%s) fait partie des résultats_regles (%s)\n",R->res,But);
				Hypothese = R->TeteListCond;
				Continue = TRUE;
				while(Hypothese != NULL && Continue)
				{	
					Continue = ChainArr_VerifBut (Hypothese->cond,res_tete,fait_tete);
					Hypothese = Hypothese->suiv;
				}
				result = Continue;
				if(result == 1)
				{
					printf("Condition :%s valide\n",But);	
					Creer_MaillonFaits(fait_tete, But);
					AfficherListe('F',res_tete,fait_tete);
				}
			}
			R=R->suiv;
		}
	}
	else
	{
		result = TRUE;
		printf("%s est un fait\n",But);
	}
		return result;								
}

/*************************************************
**  Zone de déclaration des Fonctions PRIVE     **
*************************************************/

/*************************************************************************
**  [Fonction ChainArr_RecupBut]                     					**
**  Récupere le but a demontrer depuis l'interface utilisateur          **
**																		**
**	Entrees : Char* Tableau contenant le BUT                            **
**			: ST_RES* Tete de la chaine de resultats					**
**																		**
**	Sorties : int														**
**				0 But correctement recupere                             **
**				-1 Erreur de memoire                                    **
**************************************************************************/
int ChainArr_RecupBut (char* But,ST_RES* res_tete)
{
	if(res_tete==NULL)//si liste vide Erreur	
		return -2;	
	memset(But,0,MAXSIZE*sizeof(char));
	scanf("%s",But);
	printf("Votre recherche : %s\n",But);
	return 0;
}


/*************************************************************************
**  [ChainArr_VerifFait]    		                  					**
**  Verifie si le Bur est dans les faits						        **
**																		**
**	Entrees : Char* Tableau contenant le BUT                            **
**			: ST_FAITS* Tete de la chaine de faits						**
**																		**
**	Sorties : int														**
**				0 Le But est un fait		                            **
**				1 Le But n'est pas un fait                            	**
**				-2 Erreur de chaine										**
**************************************************************************/
int ChainArr_VerifFait (char* But,ST_FAITS* fait_tete)
{
	int result = 0;//Resultat de la recherche
	ST_FAITS *F=NULL;
	
	if(fait_tete==NULL)//si liste vide Erreur	
		return -2;

	F = fait_tete;
	while(F!=NULL && result == 0)
		{
			if(strcmp(F->fait,But) != 0)
			{
				printf(" %s != %s\n",F->fait,But);
				result = 0;
			}
			else
			{
				printf(" %s = %s\n",F->fait,But);
				result = 1;
			}
			F=F->suiv;
		}
	return result;
}
